package org.sundatagroup.aurora.core.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.sundatagroup.aurora.core.dao.ModuleDao;
import org.sundatagroup.aurora.core.entity.model.ModuleModel;
import org.sundatagroup.aurora.core.entity.pojo.Module;
import org.sundatagroup.aurora.core.service.querier.IQuerier;

import com.google.gson.JsonElement;

/**
 * <p>封装了 {@link Module} 普通 CRUD 操作, 按增删改查排序
 * </p>
 * 
 * @version 0.2.0
 * <br>补充通用查询接口
 * 
 * @author CharlesChen
 * @author Zdream
 * @date 2018-05-30
 * @since 0.1
 */
@Service
public class ModuleService implements IQuerier {
	
	@Autowired
	ModuleDao moduleDao;

	/**
	 * 增加一个{@link Module}
	 * @param m
	 * @throws IllegalArgumentException Module参数错误
	 */
	public void add(Module m) {
		if (m == null || !m.isValid()) {
		    throw new IllegalArgumentException("Module 参数错误，请修改！");
		}
		ModuleModel mm = m.toModel();
		moduleDao.add(mm);
	}

	/**
	 * 查操作：根据mid查询一个{@link Module}
	 * @param mid
	 * @return
	 */
	public Module queryByMid(int mid) {
		ModuleModel model = moduleDao.findByMid(mid);

		return model == null ? null : Module.fromModel(model);
	}
	
	/**
	 * 返回所有的 {@link Module}<br>
	 * @return
	 *  module 集合
	 */
	public List<Module> queryAll() {
		List<ModuleModel> models = moduleDao.findAll();
		
		List<Module> ms = new ArrayList<>(models.size());
		models.forEach((m) -> {ms.add(Module.fromModel(m));});
		
		return ms;
	}

	/**
	 * 用分页的方式进行{@link Module}的查询
	 * @param start 起始索引
	 * @param size 数据条目数量
	 * @return
	 */
	public List<Module> queryByPage(int start, int size) {
		List<ModuleModel> moduleModels= moduleDao.findByPage(start, size);
		List<Module> moduleList = new ArrayList<>(moduleModels.size());

		for (ModuleModel moduleModel : moduleModels) {
			moduleList.add(Module.fromModel(moduleModel));
		}

		return moduleList;
	}
	/**
	 * 计算 {@link Module} 数量
	 * @return
	 */
	public int countModules() {
		return moduleDao.count();
	}

	/**
	 * 转换{@link Module}为Map，其中key为每一个Module的mid。
	 * @param moduleList module的List
	 * @return
	 */
	public Map<Integer, Module> list2map(List<Module> moduleList) {
		Map<Integer, Module> integerModuleMap = new HashMap<>(moduleList.size());
	    for (Module module : moduleList) {
	        integerModuleMap.put(module.getMid(), module);
	    }

	    return integerModuleMap;
	}

	@Override
	public String[] types() {
		return new String[] {"/query/module"};
	}

	/**
	 * 允许 <code>"/query/module"</code> 查询模块数据, 按 id 进行查询
	 */
	@Override
	public JsonElement query(String type, JsonElement key) {
		if (key.isJsonObject()) {
			Module module = this.queryByMid(key.getAsJsonObject().get("id").getAsInt());
			if (module != null) {
				return module.toJson();
			}
		}
		
		return null;
	}
}
